/**
 * 
 */
package com.ydy.utils;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

/**
 * @author xuzhaojie
 *
 *         2019年6月6日 下午4:44:21
 */
public class ImageWaterUtil {
	public static void main(String[] args) {
		markImageByText("hello world", "C:\\Users\\Wellson\\Desktop\\haha\\1.png",
				"C:\\Users\\Wellson\\Desktop\\haha\\2.png", 0, new Color(0, 0, 0), "JPG");
	}

	/**
	 * 给图片添加水印文字、可设置水印文字的旋转角度
	 * 
	 * @param logoText
	 *            要写入的文字
	 * @param srcImgPath
	 *            源图片路径
	 * @param newImagePath
	 *            新图片路径
	 * @param degree
	 *            旋转角度
	 * @param color
	 *            字体颜色
	 * @param formaName
	 *            图片后缀
	 */
	public static void markImageByText(String logoText, String srcImgPath, String newImagePath, Integer degree,
			Color color, String formaName) {
		OutputStream os = null;
		try {
			// 1、源图片
			java.awt.Image srcImg = ImageIO.read(new File(srcImgPath));
			BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),
					BufferedImage.TYPE_INT_RGB);
			// 2、得到画笔对象
			Graphics2D g = buffImg.createGraphics();
			// 3、设置对线段的锯齿状边缘处理
			g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
			g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null),
					java.awt.Image.SCALE_SMOOTH), 0, 0, null);
			// 4、设置水印旋转
			if (null != degree) {
				g.rotate(Math.toRadians(degree), buffImg.getWidth() / 2, buffImg.getHeight() / 2);
			}
			// 5、设置水印文字颜色
			g.setColor(color);
			// 6、设置水印文字Font
			g.setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, buffImg.getHeight() / 6));
			// 7、设置水印文字透明度
			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.45f));
			// 8、第一参数->设置的内容，后面两个参数->文字在图片上的坐标位置(x,y)
			g.drawString(logoText, buffImg.getWidth() / 10, buffImg.getHeight() - (buffImg.getHeight() / 10));
			// 9、释放资源
			g.dispose();
			// 10、生成图片
			os = new FileOutputStream(newImagePath);
			ImageIO.write(buffImg, formaName, os);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (null != os)
					os.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static byte[] markImageByText(String logoText, byte[] sourceByte, Integer degree, Color color,
			String formaName) throws IOException {
		ByteArrayOutputStream os = null;
		// 1、源图片
		java.awt.Image srcImg = ImageIO.read(new ByteArrayInputStream(sourceByte));
		BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),
				BufferedImage.TYPE_INT_RGB);
		// 2、得到画笔对象
		Graphics2D g = buffImg.createGraphics();
		// 3、设置对线段的锯齿状边缘处理
		g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
		g.drawImage(
				srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), java.awt.Image.SCALE_SMOOTH), 0,
				0, null);
		// 4、设置水印旋转
		if (null != degree) {
			g.rotate(Math.toRadians(degree), buffImg.getWidth() / 2, buffImg.getHeight() / 2);
		}
		// 5、设置水印文字颜色
		g.setColor(color);
		// 6、设置水印文字Font
		g.setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, buffImg.getWidth() / 20));
		// 7、设置水印文字透明度
		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.45f));
		// 8、第一参数->设置的内容，后面两个参数->文字在图片上的坐标位置(x,y)
		g.drawString(logoText, buffImg.getWidth() / 10, buffImg.getHeight() - (buffImg.getHeight() / 10));
		// 9、释放资源
		g.dispose();
		// 10、生成图片
		os = new ByteArrayOutputStream();
		ImageIO.write(buffImg, formaName, os);
		os.close();
		return os.toByteArray();
	}
}
